home *** CD-ROM | disk | FTP | other *** search
/ Almathera Ten Pack 2: CDPD 1 / Almathera Ten on Ten - Disc 2: CDPD 1.iso / pd / 101-125 / 118 / empire / src / source.zoo / cmd_general1.d < prev    next >
Text File  |  1987-12-02  |  14KB  |  567 lines

  1. #include:util.g
  2. #empire.g
  3. #empfunc.g
  4.  
  5. /* variables needed by cmd_desig: */
  6.  
  7. SectorType_t Designation;
  8.  
  9. /* ************ */
  10.  
  11. proc cmd_change()void:
  12.     uint what, i;
  13.     [NAME_LEN] char name;
  14.     [25] char buf;
  15.     bool duplicate;
  16.  
  17.     if reqChoice(&what, "name\epassword\ecountry\e",
  18.         "Change what (name/password/country): ") then
  19.     if what = 2 then
  20.         if reqCountry(&i, "Enter country to change to: ") then
  21.         if getPassword("Enter password: ",
  22.                    &Country[i].c_password[0]) then
  23.             ThisCountryNumber := i;
  24.             ThisCountry := &Country[i];
  25.             pretend(resetTimer(), void);
  26.             ConvTime(CurrentTime(), &buf[0]);
  27.             if UsingSerial then
  28.             writeln();
  29.             writeln(&buf[0], " - changed to country ",
  30.                 &ThisCountry*.c_name[0]);
  31.             putPrompt();
  32.             fi;
  33.             writeln(LogChannel; &buf[0], " - changed to country ",
  34.                 &ThisCountry*.c_name[0]);
  35.             telegramCheck();
  36.         else
  37.             writeln(Chout; "- country not changed");
  38.         fi;
  39.         fi;
  40.     else
  41.         if getPassword("Enter your current password: ",
  42.                &ThisCountry*.c_password[0]) then
  43.         if what = 0 then
  44.             write(Chout; "Enter new country name: ");
  45.             if readLine(&name[0], NAME_LEN) then
  46.             duplicate := false;
  47.             for i from 0 upto World.w_currCountries - 1 do
  48.                 if CharsEqual(&Country[i].c_name[0], &name[0]) and
  49.                     i ~= ThisCountryNumber then
  50.                 duplicate := true;
  51.                 fi;
  52.             od;
  53.             if duplicate then
  54.                 err("that name is already in use");
  55.             else
  56.                 ThisCountry*.c_name := name;
  57.                 news(n_name_change, ThisCountryNumber, DEITY);
  58.             fi;
  59.             fi;
  60.         else
  61.            pretend(getVerifiedPassword("Enter new password: "), void);
  62.         fi;
  63.         else
  64.         writeln(Chout;);
  65.         fi;
  66.     fi;
  67.     fi;
  68. corp;
  69.  
  70. proc cmd_translate()void:
  71.     int r, c;
  72.     uint country;
  73.  
  74.     if ThisCountryNumber = DEITY then
  75.     if reqCountry(&country, "Country to translate sector from? ") and
  76.         doSkipBlanks() and
  77.         reqSector(&r, &c, "Sector in that country to translate? ") then
  78.         ThisCountry := &Country[country];
  79.         writeln(Chout; &ThisCountry*.c_name[0], " sector ", r, ',', c,
  80.             " is at absolute ", transRow(r), ',', transCol(c));
  81.         ThisCountry := &Country[DEITY];
  82.     fi;
  83.     else
  84.     err("only god can use this command");
  85.     fi;
  86. corp;
  87.  
  88. proc cmd_country()void:
  89.     uint i;
  90.  
  91.     writeDate(CurrentTime());
  92.     writeln(Chout;);
  93.     writeln(Chout;
  94.         "\#  last access             time  BTU's  status    country name");
  95.     writeln(Chout;
  96.          "--------------------------------------------------------------");
  97.     for i from 0 upto World.w_currCountries - 1 do
  98.     write(Chout; i, ' ');
  99.     writeDate(Country[i].c_last);
  100.     writeln(Chout; " [", Country[i].c_timer : 3, "] [",
  101.         Country[i].c_btu : 2, "]   ",
  102.         case Country[i].c_status
  103.         incase cs_deity:
  104.             "DEITY    "
  105.         incase cs_active:
  106.             "Active   "
  107.         incase cs_dead:
  108.             "Destroyed"
  109.         incase cs_quit:
  110.             "Resigned "
  111.         incase cs_idle:
  112.              "Idle    "
  113.         default:
  114.              "*fucked*"
  115.         esac,
  116.         ' ',
  117.         &Country[i].c_name[0]
  118.     );
  119.     od;
  120.     writeln(Chout;);
  121. corp;
  122.  
  123. /*
  124.  * doCensus - part of cmd_census
  125.  */
  126.  
  127. proc doCensus(int r, c; Sector_t s)void:
  128.     [9] char DELIVERY = ('0','1','2','3','4','5','6','7',' ');
  129.  
  130.     writeln(Chout;
  131.         if s.s_price = 0 then ' ' else '$' fi,
  132.         if s.s_checkPoint = 0 then ' ' else '*' fi,
  133.         DELIVERY[s.s_direction[it_civilians]],
  134.         DELIVERY[s.s_direction[it_military]],
  135.         DELIVERY[s.s_direction[it_shells]],
  136.         DELIVERY[s.s_direction[it_guns]],
  137.         DELIVERY[s.s_direction[it_planes]],
  138.         DELIVERY[s.s_direction[it_ore]],
  139.         DELIVERY[s.s_direction[it_bars]],
  140.         if s.s_defender = NO_DEFEND then ' ' else '%' fi,
  141.         ' ', SectorChar[s.s_type],
  142.         "  ", s.s_efficiency : 3,
  143.         ' ', s.s_iron : 3,
  144.         "  ", s.s_gold : 3,
  145.         ' ', s.s_mobility : 3,
  146.         ' ', readQuan(s, it_civilians) : 4,
  147.         ' ', readQuan(s, it_military) : 3,
  148.         ' ', readQuan(s, it_shells) : 4,
  149.         ' ', readQuan(s, it_guns) : 4,
  150.         ' ', readQuan(s, it_planes) : 3,
  151.         ' ', readQuan(s, it_ore) : 4,
  152.         ' ', readQuan(s, it_bars) : 3,
  153.         ' ', s.s_production : 3,
  154.         "  ", r : 3, ',', c
  155.     );
  156. corp;
  157.  
  158. proc cmd_census()void:
  159.  
  160.     if reqSectors("Enter sectors specification for census: ") then
  161.     writeln(Chout;
  162.     "  cmsgpob des eff min gold mob civl mil   sh  gun  pl  ore bar prod");
  163.     writeln(Chout;
  164.     "-------------------------------------------------------------------");
  165.     if scanSectors(doCensus) = 0 then
  166.         err("no sectors matched");
  167.     else
  168.         writeln(Chout;);
  169.     fi;
  170.     fi;
  171. corp;
  172.  
  173. /*
  174.  * isHead - return 'true' if the sector is a bridge head.
  175.  */
  176.  
  177. proc isHead(int r, c)bool:
  178.     Sector_t s;
  179.  
  180.     readSector(r, c, s);
  181.     s.s_type = s_bridgeHead and s.s_efficiency >= 20
  182. corp;
  183.  
  184. /*
  185.  * zapSpan -
  186.  *    waste a bridge span - also used in other places.
  187.  */
  188.  
  189. proc zapSpan(Sector_t s)void:
  190.     ItemType_t it;
  191.  
  192.     s.s_type := s_water;
  193.     s.s_owner := DEITY;
  194.     s.s_efficiency := 0;
  195.     s.s_mobility := 0;
  196.     s.s_defender := NO_DEFEND;
  197.     for it from it_first upto it_last do
  198.     s.s_quantity[it] := 0;
  199.     od;
  200.     writeln(Chout; "Skreeetch! SPLASH!!!!");
  201. corp;
  202.  
  203. /*
  204.  * checkCollapse -
  205.  *    see if a given sector is an unsupported bridge span - smash it!!!!
  206.  */
  207.  
  208. proc checkCollapse(int r, c)void:
  209.     Sector_t s;
  210.  
  211.     readSector(r, c, s);
  212.     if s.s_type = s_bridgeSpan and
  213.         not isHead(r - 1, c) and
  214.         not isHead(r, c - 1) and
  215.         not isHead(r, c + 1) and
  216.         not isHead(r + 1, c) then
  217.     zapSpan(s);
  218.     writeSector(r, c, s);
  219.     fi;
  220. corp;
  221.  
  222. /*
  223.  * collapseSpans -
  224.  *    A bridge head or bridge span is being torn down.
  225.  *    Collapse any bridge spans that depend on it for support.
  226.  */
  227.  
  228. proc collapseSpans(int r, c)void:
  229.  
  230.     checkCollapse(r - 1, c);
  231.     checkCollapse(r, c - 1);
  232.     checkCollapse(r, c + 1);
  233.     checkCollapse(r + 1, c);
  234. corp;
  235.  
  236. /*
  237.  * doDesignate - part of cmd_designate
  238.  */
  239.  
  240. proc doDesignate(int r, c; Sector_t s)void:
  241.     Sector_t s1;
  242.     SectorType_t oldDesig;
  243.     ItemType_t it;
  244.  
  245.     oldDesig := s.s_type;
  246.     if ThisCountryNumber = DEITY or
  247.         oldDesig ~= s_mountain and oldDesig ~= s_bridgeSpan and
  248.         oldDesig ~= s_water then
  249.     if r = 0 and c = 0 and ThisCountryNumber ~= DEITY then
  250.         err("can't redesignate your current capital");
  251.     else
  252.         s1 := s;
  253.         if oldDesig = s_sanctuary then
  254.         writeln(Chout;"You are breaking sanctuary!!!");
  255.         news(n_broke_sanctuary, ThisCountryNumber, DEITY);
  256.         elif s.s_efficiency ~= 0 and oldDesig ~= s_wilderness and
  257.             Designation ~= oldDesig then
  258.         if Designation = s_highway then
  259.             write(Chout; "Paving over ");
  260.         else
  261.             write(Chout; "Tearing down ");
  262.         fi;
  263.         writeln(Chout; s.s_efficiency, "% efficient ",
  264.             getDesigName(oldDesig), " at ", r, ',', c);
  265.         fi;
  266.         if oldDesig = s_exchange and Designation ~= s_exchange or
  267.             oldDesig ~= s_exchange and Designation = s_exchange then
  268.         for it from it_first upto it_last do
  269.             s1.s_direction[it] := NO_DELIVER;
  270.             s1.s_threshold[it] := 0;
  271.         od;
  272.         fi;
  273.         s1.s_type := Designation;
  274.         for it from it_first upto it_last do
  275.         writeQuan(s1, it, readQuan(s, it));
  276.         od;
  277.         if Designation ~= oldDesig then
  278.         s1.s_efficiency := 0;
  279.         s1.s_production := 0;
  280.         fi;
  281.         writeSector(r, c, s1);
  282.         if oldDesig = s_bridgeHead and Designation ~= s_bridgeHead then
  283.         collapseSpans(r, c);
  284.         fi;
  285.         if Designation = s_capital and ThisCountryNumber ~= DEITY then
  286.         ThisCountry*.c_centerRow := transRow(r);
  287.         ThisCountry*.c_centerCol := transCol(c);
  288.         fi;
  289.     fi;
  290.     fi;
  291. corp;
  292.  
  293. proc cmd_designate()bool:
  294.     uint count;
  295.  
  296.     if reqSectors("Enter sectors specification for designate: ") and
  297.         doSkipBlanks() and
  298.         reqDesig(&Designation, "Enter type to designate: ") then
  299.     if (Designation = s_mountain or Designation = s_water or
  300.         Designation = s_sanctuary) and ThisCountryNumber ~= DEITY then
  301.         err("Only God can make a mountain, ocean or sanctuary");
  302.         false
  303.     else
  304.         count := scanSectors(doDesignate);
  305.         if count = 0 then
  306.         err("no sectors matched");
  307.         elif count > 1 then
  308.         writeln(Chout; count, " sectors designated");
  309.         fi;
  310.         true
  311.     fi
  312.     else
  313.     false
  314.     fi
  315. corp;
  316.  
  317. /*
  318.  * doCheckpoint - part of cmd_checkpoint
  319.  */
  320.  
  321. proc doCheckpoint(int r, c; Sector_t s)void:
  322.     channel output text promptChan;
  323.     [100] char buf;
  324.     int n;
  325.  
  326.     open(promptChan, &buf[0]);
  327.     write(promptChan;
  328.       "Enter new checkpoint code for sector ", r, ',', c, ": ");
  329.     close(promptChan);
  330.     if reqNumber(&n, &buf[0]) then
  331.     if n < -128 or n > 127 then
  332.         err("invalid checkpoint code - not changed");
  333.     else
  334.         s.s_checkPoint := n;
  335.         writeSector(r, c, s);
  336.     fi;
  337.     else
  338.     err("checkpoint code not changed");
  339.     fi;
  340. corp;
  341.  
  342. proc cmd_checkpoint()bool:
  343.  
  344.     if reqSectors("Checkpoint which sectors? ") then
  345.     skipBlanks();
  346.     if getPassword("Enter your password to verify: ",
  347.                &ThisCountry*.c_password[0]) then
  348.         if scanSectors(doCheckpoint) = 0 then
  349.         err("no sectors matched");
  350.         fi;
  351.         true
  352.     else
  353.         writeln(Chout; " - no sectors checkpointed");
  354.         false
  355.     fi
  356.     else
  357.     false
  358.     fi
  359. corp;
  360.  
  361. proc cmd_update()bool:
  362.     Sector_t s;
  363.     *char p, q;
  364.     uint count;
  365.     int r, c, top, bottom, left, right, minRow, maxRow, minCol, maxCol;
  366.     bool doit, wholeWorld;
  367.  
  368.     doit := true;
  369.     wholeWorld := false;
  370.     if InputPtr* = '\e' then
  371.     top := - (World.w_rows / 2);
  372.     bottom := (World.w_rows - 1) / 2;
  373.     left := - (World.w_columns / 2);
  374.     right := (World.w_columns - 1) / 2;
  375.     wholeWorld := true;
  376.     elif not getBox(&top, &bottom, &left, &right) then
  377.     doit := false;
  378.     fi;
  379.     if doit then
  380.     skipBlanks();
  381.     if InputPtr* ~= '\e' then
  382.         p := InputPtr;
  383.         skipWord();
  384.         q := InputPtr;
  385.         skipBlanks();
  386.         q* := '\e';
  387.         if CharsEqual(p, "terse") then
  388.         QuietUpdate := true;
  389.         elif CharsEqual(p, "verbose") then
  390.         VerboseUpdate := true;
  391.         fi;
  392.     fi;
  393.     count := 0;
  394.     minRow := 1000;
  395.     maxRow := -1000;
  396.     minCol := 1000;
  397.     maxCol := -1000;
  398.     for r from top upto bottom do
  399.         for c from left upto right do
  400.         accessSector(r, c, s);
  401.         if s.s_owner = ThisCountryNumber then
  402.             count := count + 1;
  403.             if r < minRow then
  404.             minRow := r;
  405.             fi;
  406.             if r > maxRow then
  407.             maxRow := r;
  408.             fi;
  409.             if c < minCol then
  410.             minCol := c;
  411.             fi;
  412.             if c > maxCol then
  413.             maxCol := c;
  414.             fi;
  415.         fi;
  416.         od;
  417.     od;
  418.     if wholeWorld then
  419.         minRow := minRow - 1;
  420.         maxRow := maxRow + 1;
  421.         minCol := minCol - 1;
  422.         maxCol := maxCol + 1;
  423.         ThisCountry*.c_realms[0].r_top := minRow;
  424.         ThisCountry*.c_realms[0].r_bottom := maxRow;
  425.         ThisCountry*.c_realms[0].r_left := minCol;
  426.         ThisCountry*.c_realms[0].r_right := maxCol;
  427.         ThisCountry*.c_sectorCount := count;
  428.         writeln(Chout; "Your realm 0 (\#0) is ", minRow, ':', maxRow, ',',
  429.             minCol, ':', maxCol, " and consists of ", count,
  430.             " sectors.");
  431.     fi;
  432.     true
  433.     else
  434.     false
  435.     fi
  436. corp;
  437.  
  438. proc cmd_nation()void:
  439.     Sector_t s;
  440.     uint i;
  441.  
  442.     readSector(0, 0, s);
  443.     write(Chout; "Status of ", &ThisCountry*.c_name[0], " at ");
  444.     writeDate(CurrentTime());
  445.     writeln(Chout; ": ");
  446.     writeln(Chout;);
  447.     writeln(Chout; "Number of sectors: ", ThisCountry*.c_sectorCount);
  448.     writeln(Chout; "Cash on hand: ", ThisCountry*.c_money);
  449.     writeln(Chout; "Technology level: ", ThisCountry*.c_techLevel);
  450.     i := getTechFactor(ThisCountryNumber);
  451.     writeln(Chout; "Technology factor: ", i / 100, '.', i % 100 : -2);
  452.     writeln(Chout; "Research level: ", ThisCountry*.c_resLevel);
  453.     i := calcPlagueFactor(s);
  454.     writeln(Chout; "Plague factor in capital: ", i / 100, '.', i % 100 : -2);
  455.     write(Chout; "Realms: ");
  456.     for i from 0 upto REALM_MAX - 1 do
  457.     write(Chout; '\#', i, ": ",
  458.           ThisCountry*.c_realms[i].r_top, ':',
  459.           ThisCountry*.c_realms[i].r_bottom, ',',
  460.           ThisCountry*.c_realms[i].r_left, ':',
  461.           ThisCountry*.c_realms[i].r_right, ' ');
  462.     od;
  463.     writeln(Chout;);
  464.     writeln(Chout;);
  465.     for i from 1 upto World.w_currCountries - 1 do
  466.     if i ~= ThisCountryNumber and Country[i].c_status = cs_active then
  467.         if ThisCountry*.c_relations[i] ~= r_neutral then
  468.         writeln(Chout; &ThisCountry*.c_name[0], " is ",
  469.             case ThisCountry*.c_relations[i]
  470.             incase r_allied:
  471.                 "allied"
  472.             incase r_war:
  473.                 "at war"
  474.             esac,
  475.             " with ", &Country[i].c_name[0], '.');
  476.         fi;
  477.         if Country[i].c_relations[ThisCountryNumber] ~= r_neutral then
  478.         writeln(Chout; &Country[i].c_name[0], " is ",
  479.             case Country[i].c_relations[ThisCountryNumber]
  480.             incase r_allied:
  481.                 "allied"
  482.             incase r_war:
  483.                 "at war"
  484.             esac,
  485.             " with ", &ThisCountry*.c_name[0], '.');
  486.         fi;
  487.     fi;
  488.     od;
  489.     writeln(Chout;);
  490. corp;
  491.  
  492. /*
  493.  * doContract - part of cmd_contract
  494.  */
  495.  
  496. proc doContract(int r, c; Sector_t s)void:
  497.     uint price;
  498.  
  499.     if s.s_owner = ThisCountryNumber and
  500.         (s.s_type = s_industry or
  501.          s.s_type = s_defense or
  502.          s.s_type = s_airport or
  503.          s.s_type = s_harbour or
  504.          s.s_type = s_bridgeHead or
  505.          s.s_type = s_ironMine or
  506.          s.s_type = s_goldMine or
  507.          s.s_type = s_research or
  508.          s.s_type = s_technical) then
  509.     price :=
  510.         case random(100)
  511.         incase 0..1:
  512.         random(40) + 1
  513.         incase 2..97:
  514.         random(60) + 40
  515.         incase 98..99:
  516.         random(140) + 100
  517.         esac * World.w_contractScale / 100;
  518.     writeln(Chout; "You are offered $", price * 5 / 100,
  519.         '.', price * 5 % 100 : -2,
  520.         " for the production of sector ", r, ',', c);
  521.     if ask("Do you accept? ") then
  522.         s.s_price := price;
  523.     else
  524.         s.s_price := 0;
  525.     fi;
  526.     writeSector(r, c, s);
  527.     fi;
  528. corp;
  529.  
  530. proc cmd_contract()bool:
  531.  
  532.     if reqSectors("Sector(s) to contract: ") then
  533.     if scanSectors(doContract) = 0 then
  534.         err("no sectors matched");
  535.     fi;
  536.     true
  537.     else
  538.     false
  539.     fi
  540. corp;
  541.  
  542. proc cmd_realm()void:
  543.     int top, bottom, left, right, realm;
  544.  
  545.     if getNumber(&realm) then
  546.     if realm < 0 or realm >= REALM_MAX then
  547.         err("invalid realm number");
  548.     else
  549.         skipBlanks();
  550.         if InputPtr* ~= '\e' then
  551.         if getBox(&top, &bottom, &left, &right) then
  552.             ThisCountry*.c_realms[realm].r_top := top;
  553.             ThisCountry*.c_realms[realm].r_bottom := bottom;
  554.             ThisCountry*.c_realms[realm].r_left := left;
  555.             ThisCountry*.c_realms[realm].r_right := right;
  556.         fi;
  557.         else
  558.         writeln(Chout; "Realm ", realm, " is ",
  559.             ThisCountry*.c_realms[realm].r_top, ':',
  560.             ThisCountry*.c_realms[realm].r_bottom, ',',
  561.             ThisCountry*.c_realms[realm].r_left, ':',
  562.             ThisCountry*.c_realms[realm].r_right, '.');
  563.         fi;
  564.     fi;
  565.     fi;
  566. corp;
  567.